package com.tyrone.concurrent.concurrentUtils;

/**
 * CountDownLatch 允许一个或多个线程 等待其他线程完成操作
 * CountDownLatch  实现并增加了join的功能
 * @author Tyrone
 * @date 2021/12/22 14:02
 */
public class JoinCountDownLatchTest {
    public static void main(String[] args) throws InterruptedException{
        Thread parser1 = new Thread(new Runnable() {
            @Override
            public void run() {
                //工作逻辑
            }
        });
        Thread parser2 = new Thread(new Runnable() {
            @Override
            public void run() {
                //工作逻辑
            }
        });
        parser1.start();
        parser2.start();
        /**
         * join()的原理是不停的检查Join线程是否存活，如果存活则让当前线程永远处于等待状态。
         * 检查是否存活：
         * while(isAlive()){
         *     wait(0)  // 表示永久等待
         * }
         *
         * join线程中止后，线程的this.notifyAll()方法会被调用 ，
         * 也就是说当parser1线程执行完之后，join检测isAlive()为false 将会返回
         * 此时，主线程通过调用this.notifyAll()唤醒在该类上的线程
         */
        parser1.join();
        parser1.join();
        System.out.println("All Worker Done");
    }
}
